package jp.co.toshiba.ffsa.service.csde;

import java.io.File;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;

import jp.co.toshiba.ffsa.dto.LoginDto;
import jp.co.toshiba.ffsa.entity.AttachedFile;
import jp.co.toshiba.ffsa.service.common.ConstantValue;

import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.extension.jdbc.where.SimpleWhere;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.struts.util.RequestUtil;

/**
 * ファイル削除確認画面  サービスクラス
 * @author npc
 */
public class Csde501Service {

     protected String  projectId;
     protected String  workflowId;
     protected String  inOut;
     protected String  dataType;
     protected String  revision;
     protected String  userId;

    /**
     * projectIdをセットする
     * @param projectId
     */
    public void setProjectId(String projectId){this.projectId = projectId;}
    /**
     * workflowIdをセットする
     * @param workflowId
     */
    public void setWorkflowId(String workflowId){this.workflowId = workflowId;}

    /**
     *revisionをセットする
     * @param revision
     */
    public void setRevision(String revision){this.revision = revision;}

    /**
     * attached_file情報を取得する
     * 検索条件：projectId;workflowId;revision;inOut="IN";deleteFlag＝0；
     * @return attached_file情報
     * @throws Exception
     */
    public List<AttachedFile> getAttachedFileInfo() throws Exception {

           // S2Container初期化
           SingletonS2ContainerFactory.init();

           // S2ContainerからJdbcManagerを取得
           JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);

           // 検索条件
           SimpleWhere swh = new SimpleWhere().eq("projectId" , this.projectId)
                                              .eq("workflowId", this.workflowId)
                                              .eq("revision"  , Integer.parseInt(this.revision))
                                              .eq("inOut"     , "IN")
                                              .eq("deleteFlag", ConstantValue.deleteFlagEnabled)
                                              ;
           // 情報取得
           List<AttachedFile> attachedFileList = jdbcManager.from(AttachedFile.class)
                                             .where(swh)
                                             .getResultList()
                                             ;
           return attachedFileList;
    }

    /**
     * attached_file情報からfile_path+file_nameを取得し、ファイルを指定する
     * @return fileList
     * @throws Exception
     */
    public File[] assignFile() throws Exception{

           //attached_file情報を取得する(複数件)
           List<AttachedFile> attachedFileList = this.getAttachedFileInfo();

           //fileを格納する配列をの作成
           File[] fileList = new File[attachedFileList.size()];

           for (int i = 0; i < attachedFileList.size(); i++){

               //ファイルを指定する
               String file = attachedFileList.get(i).filePath + "/" + attachedFileList.get(i).fileName;

               //配列に値をセットする
               fileList[i] =  new File(file);
           }

           return fileList;
    }


    /**
     * attached_file情報を論理削除し、件数を取得する
     * @return 結果件数
     * @throws Exception
     */
    public int deleteCount() throws Exception{

           // S2Container初期化
           SingletonS2ContainerFactory.init();

           // S2ContainerからJdbcManagerを取得
           JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);

           //ログインユーザIDゲット
           getUserId( );
           // 当日取得
           Calendar cal = Calendar.getInstance();
           Timestamp updatedAt = new Timestamp(cal.getTime().getTime());

           //attached_file情報を取得する(複数件)
           List<AttachedFile> attachedFileList = this.getAttachedFileInfo();

           int deleteCount = 0;
           for (int i = 0; i < attachedFileList.size(); i++){
             //値をセットする
             attachedFileList.get(i).deleteFlag = ConstantValue.deleteFlagDisabled;
             attachedFileList.get(i).updatedAt  = updatedAt;
             attachedFileList.get(i).updatedBy  = this.userId;

             //データを更新する(論理削除(deleteFlagの値を1にする))
             deleteCount += jdbcManager.update(attachedFileList.get(i)).includes("deleteFlag"
                                                                                 ,"updatedAt"
                                                                                 ,"updatedBy"
                                                                                 ).execute();
           }

           return deleteCount;
     }

    /**
     * ユーザID取得処理
     * @throws Exception エラー
     */
    protected void getUserId( ) throws Exception {
           userId = ((LoginDto) RequestUtil.getRequest().getSession().getAttribute("login_dto")).getUserID();
    }


}
